#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
音频处理工具
包含音频处理、格式转换功能
"""

import os
import sys
import logging
import numpy as np
import soundfile as sf
from pathlib import Path

# 导入项目模块
sys.path.append(str(Path(__file__).resolve().parent.parent))
from config.paths import TEMP_DIR, AUDIO_OUTPUT_FILE

# 配置日志
logger = logging.getLogger("音频处理")

class AudioProcessor:
    """音频处理类"""
    
    def __init__(self, sample_rate=22050):
        """
        初始化音频处理器
        
        Args:
            sample_rate: 采样率
        """
        self.sample_rate = sample_rate
    
    @staticmethod
    def save_audio(audio_data, filename=None, sample_rate=22050, format='wav'):
        """
        保存音频数据到文件
        
        Args:
            audio_data: 音频数据数组
            filename: 文件名（完整路径）
            sample_rate: 采样率
            format: 文件格式
            
        Returns:
            str: 保存的文件路径
        """
        try:
            # 如果未指定文件名，使用默认输出文件
            if filename is None:
                filename = AUDIO_OUTPUT_FILE
            
            # 确保目录存在
            os.makedirs(os.path.dirname(filename), exist_ok=True)
            
            # 保存音频
            sf.write(filename, audio_data, sample_rate, format=format)
            logger.info(f"音频已保存: {filename}")
            return filename
        except Exception as e:
            logger.error(f"保存音频时出错: {str(e)}")
            return None
    
    @staticmethod
    def load_audio(file_path):
        """
        加载音频文件
        
        Args:
            file_path: 音频文件路径
            
        Returns:
            tuple: (音频数据, 采样率)
        """
        try:
            data, sample_rate = sf.read(file_path)
            return data, sample_rate
        except Exception as e:
            logger.error(f"加载音频时出错: {str(e)}")
            return None, None
    
    @staticmethod
    def play_audio(file_path):
        """
        播放音频文件
        
        Args:
            file_path: 音频文件路径
        """
        try:
            # 根据操作系统选择播放命令
            if sys.platform == "win32":
                os.system(f'start {file_path}')
            elif sys.platform == "darwin":  # macOS
                os.system(f'afplay {file_path}')
            else:  # Linux
                os.system(f'aplay {file_path}')
                
            logger.info(f"正在播放: {file_path}")
        except Exception as e:
            logger.error(f"播放音频时出错: {str(e)}")
    
    @staticmethod
    def convert_format(input_file, output_format='mp3', output_file=None):
        """
        转换音频格式
        
        Args:
            input_file: 输入文件路径
            output_format: 输出格式
            output_file: 输出文件路径（None表示自动生成）
            
        Returns:
            str: 输出文件路径
        """
        try:
            # 如果未指定输出文件，则自动生成
            if output_file is None:
                input_path = Path(input_file)
                output_file = str(input_path.with_suffix(f'.{output_format}'))
            
            # 加载输入文件
            audio_data, sample_rate = sf.read(input_file)
            
            # 保存为新格式
            sf.write(output_file, audio_data, sample_rate, format=output_format)
            logger.info(f"已将 {input_file} 转换为 {output_file}")
            
            return output_file
        except Exception as e:
            logger.error(f"转换音频格式时出错: {str(e)}")
            return None

# 示例用法
if __name__ == "__main__":
    # 创建简单的音频测试
    processor = AudioProcessor()
    
    # 生成测试音频（440Hz的A音）
    duration = 3  # 3秒
    sample_rate = 22050
    t = np.linspace(0, duration, int(duration * sample_rate), False)
    audio = np.sin(2 * np.pi * 440 * t) * 0.3
    
    # 保存音频
    output_file = os.path.join(TEMP_DIR, "test_audio.wav")
    processor.save_audio(audio, output_file, sample_rate)
    
    # 播放音频
    processor.play_audio(output_file)
    
    # 转换格式
    processor.convert_format(output_file, 'flac') 